NHibernate তে Scalar Queries এবং ResultTransformer দুটি গুরুত্বপূর্ণ কৌশল যা আপনাকে কমপ্লেক্স ডেটাবেস কুয়েরি থেকে একক বা সীমিত ধরনের ডেটা বের করতে এবং কাস্টম অবজেক্টে রূপান্তর করতে সাহায্য করে। এদের ব্যবহারের মাধ্যমে, আপনি ডেটাবেস থেকে শুধুমাত্র প্রয়োজনীয় ডেটা আহরণ করতে পারেন, যা আপনার অ্যাপ্লিকেশনের পারফরম্যান্স বৃদ্ধি করবে।
Scalar Query কী?
Scalar Query হল এমন একটি কুয়েরি, যা শুধুমাত্র একটি একক মান বা ছোট পরিমাণ ডেটা রিটার্ন করে, যেমন একটি সংখ্যা, একটি স্ট্রিং বা অন্যান্য কোন একক ভ্যালু। সাধারণত, Scalar Query গুলো ব্যবহার করা হয় যখন আপনাকে শুধুমাত্র একটি নির্দিষ্ট কলামের বা কিছু হিসাবী ফলাফল (যেমন COUNT, SUM, MAX, ইত্যাদি) প্রয়োজন।
NHibernate তে Scalar Query এক্সিকিউট করতে আপনি সাধারণত CreateQuery বা CreateSQLQuery মেথড ব্যবহার করেন।
Scalar Query উদাহরণ
ধরা যাক, আমরা Employee টেবিল থেকে মোট কর্মচারীর সংখ্যা বের করতে চাই।
using (ISession session = sessionFactory.OpenSession())
{
string hql = "SELECT COUNT(e) FROM Employee e";
var result = session.CreateQuery(hql).UniqueResult<int>();
Console.WriteLine($"Total number of employees: {result}");
}
এখানে:
UniqueResult<int>()মেথডটি Scalar Query এর ফলাফল হিসেবে একটি একক মান (এই ক্ষেত্রে, একটি সংখ্যা) ফেরত দিবে।COUNT(e)SQL ফাংশন ব্যবহার করা হয়েছে, যা মোট কর্মচারীর সংখ্যা হিসাব করবে।
এটি একটি সাধারিত Scalar Query উদাহরণ যা শুধু একটি একক ফলাফল ফেরত দেয়।
ResultTransformer Techniques
ResultTransformer হল একটি NHibernate এর টুল, যা SQL বা HQL কুয়েরির ফলাফলকে একটি কাস্টম অবজেক্টে রূপান্তর করতে ব্যবহৃত হয়। ResultTransformer একটি অত্যন্ত শক্তিশালী কৌশল, যেটি আপনাকে SQL কুয়েরির ফলাফলকে আপনার নির্দিষ্ট ডোমেইন অবজেক্টে, DTO (Data Transfer Object) বা ডিকশনারি আকারে রূপান্তর করতে সাহায্য করে।
ResultTransformer এর প্রধান ব্যবহার
- AliasToBean: এটি SQL বা HQL কুয়েরির ফলাফলকে নির্দিষ্ট DTO ক্লাসে রূপান্তরিত করে।
- AliasToEntityMap: এটি কুয়েরির ফলাফলকে একটি
Dictionary<string, object>আকারে রূপান্তর করে, যেখানে কলাম নামগুলো কী হিসেবে এবং তাদের মানগুলো ভ্যালু হিসেবে থাকে। - Transformers.AliasToList: একাধিক ফলাফল একত্রে একটি তালিকায় রূপান্তর করে।
ResultTransformer এর সাহায্যে Scalar Query এর রেজাল্ট রূপান্তর করা
ধরা যাক, আমরা Employee এবং Department এর সম্পর্কের মধ্যে ডেটা সংগ্রহ করতে চাই এবং আমরা সেই ডেটা কাস্টম DTO ক্লাসে রূপান্তর করতে চাই।
1. DTO (Data Transfer Object) ক্লাস তৈরি
public class EmployeeDepartmentDTO
{
public virtual int EmployeeId { get; set; }
public virtual string EmployeeName { get; set; }
public virtual string DepartmentName { get; set; }
}
2. HQL Scalar Query এবং ResultTransformer ব্যবহার
using (ISession session = sessionFactory.OpenSession())
{
string hql = @"
SELECT e.EmployeeId AS EmployeeId, e.Name AS EmployeeName, d.Name AS DepartmentName
FROM Employee e
JOIN e.Department d";
var query = session.CreateQuery(hql);
// ResultTransformer এর মাধ্যমে রেজাল্ট DTO তে রূপান্তর করা
query.SetResultTransformer(Transformers.AliasToBean<EmployeeDepartmentDTO>());
var result = query.List<EmployeeDepartmentDTO>();
foreach (var item in result)
{
Console.WriteLine($"Employee: {item.EmployeeName}, Department: {item.DepartmentName}");
}
}
এখানে:
- AliasToBean ব্যবহার করা হয়েছে, যাতে SQL কুয়েরির ফলাফল সরাসরি
EmployeeDepartmentDTOক্লাসে রূপান্তরিত হয়। - HQL কুয়েরি ব্যবহার করা হয়েছে, যা Employee এবং Department এর নাম (যেমন
e.Nameএবংd.Name) রিটার্ন করছে।
এই কৌশলটি বিশেষভাবে উপকারী যখন আপনি SQL বা HQL কুয়েরির ফলাফলকে DTO বা অন্য কাস্টম ক্লাসে রূপান্তর করতে চান, যাতে তা ব্যবহারকারী ইন্টারফেসে প্রদর্শন করা বা অন্যান্য প্রয়োজনে ব্যবহার করা যায়।
Scalar Query এর মাধ্যমে Complex Aggregation
ধরা যাক, আপনি Employee টেবিল থেকে বিভাগের ভিত্তিতে মোট কর্মচারীর সংখ্যা এবং তাদের গড় বয়স বের করতে চান।
using (ISession session = sessionFactory.OpenSession())
{
string hql = @"
SELECT d.Name AS DepartmentName, COUNT(e.EmployeeId) AS TotalEmployees, AVG(e.Age) AS AverageAge
FROM Employee e
JOIN e.Department d
GROUP BY d.Name";
var query = session.CreateQuery(hql);
// Scalar result fetching
var result = query.List<object[]>();
foreach (var row in result)
{
string departmentName = (string)row[0];
int totalEmployees = (int)row[1];
double averageAge = (double)row[2];
Console.WriteLine($"Department: {departmentName}, Total Employees: {totalEmployees}, Average Age: {averageAge}");
}
}
এখানে:
object[]ব্যবহার করা হয়েছে, কারণ কুয়েরি একাধিক কলাম রিটার্ন করছে।COUNTএবংAVGফাংশন ব্যবহার করা হয়েছে যেগুলি অ্যাগ্রিগেট রেজাল্ট প্রদান করে।
এটি Scalar Query এর মাধ্যমে একাধিক অ্যাগ্রিগেটেড ফলাফল সংগ্রহের একটি উদাহরণ।
ResultTransformer এর অন্যান্য ধরন
NHibernate তে আরও কিছু সাধারণ ResultTransformer আছে, যেগুলি নির্দিষ্ট প্রয়োজন অনুযায়ী ব্যবহার করা হয়:
1. AliasToEntityMap
এটি SQL কুয়েরির ফলাফলকে একটি Dictionary<string, object> তে রূপান্তর করে।
var query = session.CreateQuery("SELECT e.EmployeeId, e.Name FROM Employee e");
query.SetResultTransformer(Transformers.AliasToEntityMap());
var result = query.List();
foreach (var row in result)
{
var map = (IDictionary<string, object>)row;
Console.WriteLine($"EmployeeId: {map["EmployeeId"]}, Name: {map["Name"]}");
}
2. AliasToList
একাধিক রেজাল্ট (অথবা কলাম) একটি তালিকায় রূপান্তর করে।
var query = session.CreateQuery("SELECT e.Name, e.Age FROM Employee e");
query.SetResultTransformer(Transformers.AliasToList());
var result = query.List();
foreach (var row in result)
{
var list = (IList<object>)row;
Console.WriteLine($"Name: {list[0]}, Age: {list[1]}");
}
উপসংহার
Scalar Queries এবং ResultTransformers ব্যবহার করে আপনি NHibernate এ কাস্টম ডেটা রিট্রিভাল এবং রূপান্তর অত্যন্ত সহজভাবে করতে পারেন। Scalar Query তে আপনি একক বা অ্যাগ্রিগেটেড ডেটা উদ্ধার করতে পারেন এবং ResultTransformer এর মাধ্যমে আপনি সেই ডেটাকে আপনার প্রয়োজনীয় অবজেক্টে রূপান্তর করতে পারবেন। এর ফলে, আপনি অধিক নমনীয়তা এবং পারফরম্যান্স পাচ্ছেন যখন আপনি ডেটাবেস থেকে কাস্টম ডেটা সংগ্রহ এবং রূপান্তর করেন।
Read more